#include "StringUtils.h"

using namespace tmms::base;

// 字符串前缀匹配
bool StringUtils::StartsWith(const string &s, const string &sub) {
    if(sub.empty()) {
        return true;
    }
    if(s.empty()) {
        return false;
    }
    auto len = s.size();
    auto slen = sub.size();
    if(len < slen) {
        return false;
    }
    return s.compare(0, slen, sub) == 0;    // 从0开始，子串长度slen
}
// 字符串后缀比较
bool StringUtils::EndsWith(const string &s, const string &sub) {
    if(sub.empty()) {
        return true;
    }
    if(s.empty()) {
        return false;
    }
    auto len = s.size();
    auto slen = sub.size();
    if(len < slen) {
        return false;
    }
    return s.compare(len-slen, slen, sub) == 0;
}

// 取文件路径的目录
string StringUtils::FilePath(const string &path) {
    auto pos = path.find_last_of("/\\");    // 从字符串尾开始，匹配字符串中任意一个字符
    if(pos != std::string::npos) {
        return path.substr(0, pos);
    } else {
        return "./";    // 返回当前路径
    }
}
//在路径里取文件名和扩展名
string StringUtils::FileNameExt(const string &path) {
    auto pos = path.find_last_of("/\\");
    if(pos != string::npos) {
        if(pos + 1 < path.size()) { // 判断是否到了文件名的结尾
            return path.substr(pos+1);
        }
    }
    return path;
}
// 取文件名（无后缀）
string StringUtils::FileName(const string &path){
    string file_name = FileNameExt(path);
    auto pos = file_name.find_last_of(".");
    if(pos != string::npos) {
        if(pos != 0) {
            return file_name.substr(0,pos);
        }
    }
    return file_name;
}
// 取文件扩展名
string StringUtils::Extension(const string &path) {
    string file_name = FileNameExt(path);
    auto pos = file_name.find_last_of(".");
    if(pos != string::npos) {
        if(pos != 0 && pos + 1 < file_name.size()) {
            return file_name.substr(pos+1);
        }
    }
    return string();
}
// 字符串分割
std::vector<string> StringUtils::SplitString(const string &s,const string &delimiter)
{
    if(delimiter.empty()) {
        return std::vector<string>{};
    }
    std::vector<string> result;
    size_t last = 0;
    size_t next = 0;
    while((next = s.find(delimiter, last)) != string::npos) {
        if(next > last) {
            result.emplace_back(s.substr(last, next - last));
        }
        last = next + delimiter.size(); // 更新最后一个位置
    }
    // 如果last没有超过最后的位置，就把最后的子串加进去
    if(last < s.size()) {
        result.emplace_back(s.substr(last));
    }
    return result;  // 编译器优化
}